package netty.ProtoBuf.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;

;

/**
 * @ClassName ServerHandler
 * @Description TODO
 * @Author director吴
 * @Date 2022/1/19 12:56
 * @Version 1.0
 *
 *  ****   自定义handler需要继承netty指定的 handler 适配器，此时我们定义handler 才能被纳入到netty的 handler 工作组中
 *
 **/
//public class ServerHandler extends ChannelInboundHandlerAdapter {


    /*
    1.继承  ChannelInboundHandlerAdapter  实现 channelRead方法   channelRead方法  使用object类接消息
    2.继承  SimpleChannelInboundHandler  实现 channelRead0方法  channelRead0方法  使用指定的泛型类型接收消息 如<StudentPOJO.Student>
     */

public class ServerHandler extends SimpleChannelInboundHandler<StudentPOJO.Student> {













    /**   读取数据  -- -- 读取客户端发送的消息
     *
     *    ChannelHandlerContext  :上下文对象-----可以获取【通道】 【管道】 【地址】  。。。等很多信息
     *                  Object   :客户端发送的数据
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    //继承  ChannelInboundHandlerAdapter   使用  Object


        //读取从客户端发送的Proto
        StudentPOJO.Student student = (StudentPOJO.Student)msg;

        System.out.println("客户端发送的数据 id=" +student.getId());
        System.out.println("客户端发送的数据 name=" +student.getName());

    }




    //继承  ChannelInboundHandlerAdapter 使用指定的泛型类型<StudentPOJO.Studen>
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, StudentPOJO.Student student) throws Exception {


        System.out.println("客户端发送的数据 id=" +student.getId());
        System.out.println("客户端发送的数据 name=" +student.getName());



    }


    /**   数据读取完毕---  回复消息
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        /*
        ChannelHandlerContext  的写入方法  有
                  ctx.writeAndFlush ()   ----写入到 【缓存区域】并  【刷新】--刷新就是将缓存的属性再写入到管道
                  ctx.write()           ----写入   【缓存区域】，并没有将数据刷新到管道
         */


        //需要对发送的数据进修编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端", CharsetUtil.UTF_8));
    }




    /**   异常处理
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
